// 高级函数实现AOP(面向切面编程)
// 主要作用时把一些跟核心业务逻辑模块无关的功能抽离出来，这些跟业务逻辑无关的功能通常包括日志统计，安全控制，异常处理等。把这些功能抽离出来后，再通过“动态植入”的方式参入到业务逻辑模块中。这样可以业务代码的独立性。
/*
    // javascript中实现AOP 都是把一个函数动态织入到另外一个函数中。
    Function.prototype.before = function(beforeFn) {
        var _self = this;
        return function() {
            beforeFn.apply(this, arguments);
            return _self.apply(this, arguments);
        }
    }

    Function.prototype.after = function(afterFn) {
        var _self = this;
        return function() {
            var ret = _self.apply(this, arguments);
            afterFn.apply(this, arguments);
            return ret;
        }
    }

    var func = function() {
        console.log(2);
    }

    var calcRet = func.before(function() {
        console.log(1);
    }).after(function() {
        console.log(3);
    });

    calcRet();
 */